﻿#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#if 0
int main() {
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int* p = &arr[0];
	printf("&arr[0] = %p\n", &arr[0]);//%p是可以得到地址的。
	printf("arr = %p\n", arr);

	return 0;
}


int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	printf("%d\n", sizeof(arr));
	return 0;
}

int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	printf("&arr[0] = %p\n", &arr[0]);
	printf("arr = %p\n", arr);
	printf("&arr = %p\n", &arr);
	return 0;
}


int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	printf("&arr[0] = %p\n", &arr[0]);
	printf("&arr[0]+1 = %p\n", &arr[0] + 1);
	printf("arr = %p\n", arr);
	printf("arr+1 = %p\n", arr + 1);
	printf("&arr = %p\n", &arr);
	printf("&arr+1 = %p\n", &arr + 1);
	return 0;
}


int main()
{
		int arr[10] = { 0 };
		//输⼊ 
		int i = 0;
		int sz = sizeof(arr) / sizeof(arr[0]);//计算数组的长度。
		//输⼊ 
		int* p = arr;//根据之前的知识，就可以这样理解了int* p=&arr[0];
		printf("请输入：\n");
		for (i = 0; i < sz; i++)
		{
			scanf("%d", p+i);//(p+i)==(&arr[0]+i)==(arr+i)
			//scanf("%d", arr+i);//也可以这样写 
		}
		//输出 
		printf("输出结果：\n");
		for (i = 0; i < sz; i++)
		{
			printf("%d ", *(p + i));
		}
		printf("\n");
		for (i = 0; i < sz; i++)
		{
			printf("%d ", p[i]);//根据结果可知两种方式的输出结果一致，可知 *(p + i)==p[i]；
		}
		return 0;
	}


void test1(int arr[])
{
	int sz2 = sizeof(arr) / sizeof(arr[0]);
	printf("sz2 = %d\n", sz2);
}

int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int sz1 = sizeof(arr) / sizeof(arr[0]);
	printf("sz1 = %d\n", sz1);
	test(arr);
	return 0;
}

void test2(int arr[])//参数写成数组形式，本质上还是指针 
{
	printf("%d\n", sizeof(arr));
}

void test3(int* arr)//参数写成指针形式 
{
	printf("%d\n", sizeof(arr));//计算⼀个指针变量的⼤⼩ 
}

int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	test2(arr);
	test3(arr);
	return 0;
}


//冒泡排序：
//⽅法1 
void bubble_sort(int arr[], int sz)//参数接收数组元素个数 
{
	int i = 0;
	for (i = 0; i < sz - 1; i++)
	{
		int j = 0;
		for (j = 0; j < sz - i - 1; j++)
		{
			if (arr[j] > arr[j + 1])//进行比较大小
			{
				int tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
			}
		}
	}
}
int main()
{
	int arr[] = { 0,1,2,3,4,5,6,8,7,9 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	bubble_sort(arr, sz);
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}

}

	//⽅法2 - 优化 
	void bubble_sort(int arr[], int sz)//参数接收数组元素个数 
	{
		int i = 0;
		for (i = 0; i < sz - 1; i++)
		{
			int flag = 1;//假设这⼀趟已经有序了 
			int j = 0;
			for (j = 0; j < sz - i - 1; j++)
			{
				if (arr[j] > arr[j + 1])
				{
					flag = 0;//发⽣交换就说明，⽆序 
					int tmp = arr[j];
					arr[j] = arr[j + 1];
					arr[j + 1] = tmp;
				}
			}
			if (flag == 1)//这⼀趟没交换就说明已经有序，后续⽆序排序了 
				break;
		}
	}
	int main()
	{
		int arr[] = { 0,1,2,3,4,5,6,8,7,9 };
		int sz = sizeof(arr) / sizeof(arr[0]);
		bubble_sort(arr, sz);
		for (int i = 0; i < sz; i++)
		{
			printf("%d ", arr[i]);
		}
		return 0;
	}


	int main()
	{
		int a = 10;
		int* p = &a;//p是一级指针，指向a的地址。
		int** pp = &p;//pp是一级指针，指向p的地址。
		printf("%d\n", *p);
		printf("%d\n", **pp);
	}

	


	int main()
	{
		int arr1[] = { 1,2,3,4,5 }; 
		int arr2[] = { 2,3,4,5,6 }; 
		int arr3[] = { 3,4,5,6,7 };
		int* parr[3] = { arr1,arr2,arr3 };
		return 0;
	}
#endif


	int main()
	{
		int arr1[] = { 1,2,3,4,5 };
		int arr2[] = { 2,3,4,5,6 };
		int arr3[] = { 3,4,5,6,7 };
		int* parr[3] = { arr1,arr2,arr3 };
		for (int i = 0; i < 3; i++)//根据parr里面的元素个数
		{
			for (int j = 0; j < 5; j++)//根据arr1,2，3里面的个数
			{
				printf("%d ", *(*(parr+i)+j));//*(*(parr+i)+j)==parr[i][j]  *(parr+i)==parr[i]
			}
			printf("\n");
		}
		return 0;
	}